# 最近有些组合装调价，看下抖音各组合装单价的变化，出一份最新的各组合装的单价
# 商家编码	商品单价	商品数量	成交金额	平台优惠券  VS   商品编码	商品数量	成交金额	平台优惠金额	达人优惠金额
# 抖音近7天的就可以

# 店铺  商家编码  商品单价  订单应付金额   平台优惠	商家优惠
# 一个单价，一个到手价，
#   单价='商品单价'，
#   到手价=（'订单应付金额'+'平台实际承担优惠金额'+'达人实际承担优惠金额'）/商品数量

# 平台实际承担优惠金额
# 达人实际承担优惠金额

# 商品数量	商品单价	订单应付金额	平台实际承担优惠金额	达人实际承担优惠金额


#
# import pandas as pd
# import os
#
# # 文件列表
# files = [f'抖音{i}.xlsx' for i in range(1, 5)]
#
# # 读取并合并文件
# dfs = []
# for file in files:
#     file_path = fr'G:\工作\每日\{file}'
#     if os.path.exists(file_path):
#         try:
#             df = pd.read_excel(file_path)
#             dfs.append(df)
#             print(f"成功读取: {file}")
#         except Exception as e:
#             print(f"读取失败 {file}: {e}")
#     else:
#         print(f"文件不存在: {file_path}")
#
# if not dfs:
#     print("没有读取到文件！")
#     exit()
#
# # 合并数据
# combined = pd.concat(dfs, ignore_index=True)
#
# # 筛选有效订单
# valid_orders = combined[
#     (combined['订单状态'].isin(['已签收', '待发货', '已完成', '已发货', '已支付'])) &
#     (~combined['售后状态'].isin(['退款成功', '售后完成', '退款完成', '已全额退款']))
# ].copy()
#
# # 计算到手价
# valid_orders['到手价'] = (
#     valid_orders['订单应付金额'] +
#     valid_orders['平台实际承担优惠金额'] +
#     valid_orders['达人实际承担优惠金额']
# ) / valid_orders['商品数量']
#
# # 按照商家编码和商品单价分组并汇总
# result = valid_orders.groupby(['商家编码', '商品单价']).agg({
#     '商品数量': 'sum',
#     '到手价': 'mean',
#     '订单应付金额': 'sum',
#     '平台实际承担优惠金额': 'sum',
#     '达人实际承担优惠金额': 'sum'
# }).reset_index()
#
# # 重新排列列的顺序
# result = result[['商家编码', '商品数量', '商品单价', '到手价', '订单应付金额', '平台实际承担优惠金额', '达人实际承担优惠金额']]
#
# # 保存结果
# result.to_excel(r'H:\pycharmproject\需求\最新组合装单价.xlsx', index=False)
#
# print(result)
# print(f'完成，共{len(result)}个商家')


# # V2.0
# import pandas as pd
# import os
#
# # 文件列表
# files = [f'抖音{i}.xlsx' for i in range(1, 5)]
#
# # 读取并合并文件
# dfs = []
# for file in files:
#     file_path = fr'G:\工作\每日\{file}'
#     if os.path.exists(file_path):
#         try:
#             df = pd.read_excel(file_path)
#             df['平台']= file.replace('.xlsx', '')
#             for col in df.columns:
#                 if df[col].dtype == 'object':  # String columns
#                     df[col] = df[col].astype(str).str.strip()
#
#             dfs.append(df)
#             print(f"成功读取: {file}")
#         except Exception as e:
#             print(f"读取失败 {file}: {e}")
#     else:
#         print(f"文件不存在: {file_path}")
#
# if not dfs:
#     print("没有读取到文件！")
#     exit()
#
# # 合并数据
# combined = pd.concat(dfs, ignore_index=True)
#
# # 筛选有效订单
# valid_orders = combined[
#     (combined['订单状态'].isin(['已签收', '待发货', '已完成', '已发货', '已支付'])) &
#     (~combined['售后状态'].isin(['退款成功', '售后完成', '退款完成', '已全额退款']))
# ].copy()
#
# # 计算到手价
# valid_orders['到手价'] = (
#     valid_orders['订单应付金额'] +
#     valid_orders['平台实际承担优惠金额'] +
#     valid_orders['达人实际承担优惠金额']
# ) / valid_orders['商品数量']
#
# # 按照商家编码和商品单价分组并汇总
# result = valid_orders.groupby(['商家编码', '商品单价']).agg({
#     '商品数量': 'sum',
#     '到手价': 'mean',
#     '订单应付金额': 'sum',
#     '平台实际承担优惠金额': 'sum',
#     '达人实际承担优惠金额': 'sum',
#     '订单提交时间': 'min' ,
#     '平台': 'first'
# }).reset_index()
#
# # 重新排列列的顺序
# result = result[['平台','商家编码', '订单提交时间', '商品数量', '商品单价', '到手价', '订单应付金额', '平台实际承担优惠金额', '达人实际承担优惠金额']]
#
# # 保存结果
# result.to_excel(r'H:\pycharmproject\需求\最新组合装单价.xlsx', index=False)
#
# print(result)
# print(f'完成，共{len(result)}个商家')



# 3.0

#
# import pandas as pd
# import os
#
# # 文件列表
# files = [f'抖音{i}.xlsx' for i in range(1, 5)]
#
# # 读取并合并文件
# dfs = []
# for file in files:
#     file_path = fr'G:\工作\每日\{file}'
#     if os.path.exists(file_path):
#         try:
#             df = pd.read_excel(file_path)
#             df['平台'] = file.replace('.xlsx', '')
#
#             for col in df.columns:
#                 if df[col].dtype == 'object':
#                     df[col] = df[col].astype(str).str.strip()
#
#             dfs.append(df)
#             print(f"成功读取: {file}")
#         except Exception as e:
#             print(f"读取失败 {file}: {e}")
#     else:
#         print(f"文件不存在: {file_path}")
#
# if not dfs:
#     print("没有读取到文件！")
#     exit()
#
# # 合并数据
# combined = pd.concat(dfs, ignore_index=True)
#
# # 筛选有效订单
# valid_orders = combined[
#     (combined['订单状态'].isin(['已签收', '待发货', '已完成', '已发货', '已支付'])) &
#     (~combined['售后状态'].isin(['退款成功', '售后完成', '退款完成', '已全额退款']))
# ].copy()
#
# # 计算到手价
# valid_orders['到手价'] = (
#     valid_orders['订单应付金额'] +
#     valid_orders['平台实际承担优惠金额'] +
#     valid_orders['达人实际承担优惠金额']
# ) / valid_orders['商品数量']
#
# # 按照平台、商家编码和商品单价分组并汇总
# result = valid_orders.groupby(['平台', '商家编码', '商品单价']).agg({
#     '商品数量': 'sum',
#     '到手价': 'mean',
#     '订单应付金额': 'sum',
#     '平台实际承担优惠金额': 'sum',
#     '达人实际承担优惠金额': 'sum',
#     '订单提交时间': 'min'
# }).reset_index()
#
# # 重新排列列的顺序
# result = result[['平台', '商家编码', '订单提交时间', '商品数量', '商品单价', '到手价', '订单应付金额', '平台实际承担优惠金额', '达人实际承担优惠金额']]
#
# # 保存结果
# result.to_excel(r'H:\pycharmproject\需求\最新组合装单价.xlsx', index=False)
#
# print(result)
# print(f'完成，共{len(result)}个商家')



# 4.0
#
# import pandas as pd
# import os
#
# # 文件列表
# files = [f'抖音{i}.xlsx' for i in range(1, 5)]
#
# # 读取并合并文件
# dfs = []
# for file in files:
#     file_path = fr'G:\工作\每日\{file}'
#     if os.path.exists(file_path):
#         try:
#             df = pd.read_excel(file_path)
#             df['平台'] = file.replace('.xlsx', '')
#
#             # 清理所有文本列的空格，防止 'A ' 和 'A' 被分成两组
#             for col in df.columns:
#                 if df[col].dtype == 'object':
#                     df[col] = df[col].astype(str).str.strip()
#
#             dfs.append(df)
#             print(f"成功读取: {file}")
#         except Exception as e:
#             print(f"读取失败 {file}: {e}")
#     else:
#         print(f"文件不存在: {file_path}")
#
# if not dfs:
#     print("没有读取到文件！")
#     exit()
#
# # 合并数据
# combined = pd.concat(dfs, ignore_index=True)
#
# # 确保时间列是时间格式（防止Excel读取为字符串，导致取min不准确）
# combined['订单提交时间'] = pd.to_datetime(combined['订单提交时间'], errors='coerce')
#
# # 筛选有效订单 (使用 .copy() 避免警告)
# valid_orders = combined[
#     (combined['订单状态'].isin(['已签收', '待发货', '已完成', '已发货', '已支付'])) &
#     (~combined['售后状态'].isin(['退款成功', '售后完成', '退款完成', '已全额退款']))
#     ].copy()
#
# # 计算到手价
# valid_orders['到手价'] = (
#                                  valid_orders['订单应付金额'] +
#                                  valid_orders['平台实际承担优惠金额'] +
#                                  valid_orders['达人实际承担优惠金额']
#                          ) / valid_orders['商品数量']
#
# # 按照平台、商家编码和商品单价分组并汇总
# # '订单提交时间': 'min' 的意思是：找出这个价格最早的那笔订单时间
# result = valid_orders.groupby(['平台', '商家编码', '商品单价']).agg({
#     '商品数量': 'sum',
#     '到手价': 'mean',
#     '订单应付金额': 'sum',
#     '平台实际承担优惠金额': 'sum',
#     '达人实际承担优惠金额': 'sum',
#     '订单提交时间': 'min'  # 取该价格下的最早时间
# }).reset_index()
#
# # ------------------- 关键修改点 -------------------
# # 修改列名为更直观的名称（可选）
# result.rename(columns={'订单提交时间': '该价格最早出现时间'}, inplace=True)
#
# # 排序：先按【商家编码】归类，再按【时间】以看到价格变化顺序
# result = result.sort_values(by=['商家编码', '该价格最早出现时间'], ascending=[True, True])
# # -------------------------------------------------
#
# # 整理列顺序
# result = result[
#     ['平台', '商家编码', '该价格最早出现时间', '商品数量', '商品单价', '到手价', '订单应付金额', '平台实际承担优惠金额',
#      '达人实际承担优惠金额']]
#
# # 保存结果
# out_path = r'H:\pycharmproject\需求\最新组合装单价.xlsx'
# result.to_excel(out_path, index=False)
#
# print(result.head(10))  # 打印前10行看看效果
# print(f'完成，共{len(result)}个条数据，已保存至: {out_path}')


# 5.0


import pandas as pd
import os

# 1. 读取部分保持不变
files = [f'抖音{i}.xlsx' for i in range(1, 5)]
dfs = []
for file in files:
    file_path = fr'G:\工作\每日\{file}'
    if os.path.exists(file_path):
        try:
            df = pd.read_excel(file_path)
            df['平台'] = file.replace('.xlsx', '')
            for col in df.columns:
                if df[col].dtype == 'object':
                    df[col] = df[col].astype(str).str.strip()
            dfs.append(df)
            print(f"成功读取: {file}")
        except Exception as e:
            print(f"读取失败 {file}: {e}")

if not dfs:
    exit()

combined = pd.concat(dfs, ignore_index=True)

# ----------------- 核心修改开始 -----------------

# 2. 必须先准确转换时间格式
combined['订单提交时间'] = pd.to_datetime(combined['订单提交时间'], errors='coerce')

# 3. 筛选有效订单
valid_orders = combined[
    (combined['订单状态'].isin(['已签收', '待发货', '已完成', '已发货', '已支付'])) &
    (~combined['售后状态'].isin(['退款成功', '售后完成', '退款完成', '已全额退款']))
].copy()

# 4. 计算单笔订单的到手价（为了更精确，建议把单价四舍五入到2位小数，防止浮点数误差）
valid_orders['商品单价'] = valid_orders['商品单价'].astype(float).round(2)
valid_orders['到手价'] = (
    valid_orders['订单应付金额'] +
    valid_orders['平台实际承担优惠金额'] +
    valid_orders['达人实际承担优惠金额']
) / valid_orders['商品数量']

# 1. 按平台、商家编码和订单提交时间排序
valid_orders = valid_orders.sort_values(by=['平台', '商家编码', '订单提交时间'])

# 2. 检测价格变化点
# 识别同一商家在同一平台上的价格变化
is_price_change = (
    (valid_orders['商家编码'] != valid_orders['商家编码'].shift(1)) |
    (valid_orders['平台'] != valid_orders['平台'].shift(1)) |
    (valid_orders['商品单价'] != valid_orders['商品单价'].shift(1))
)

# 3. 为每次价格变化创建唯一标识符
valid_orders['price_change_id'] = is_price_change.cumsum()

# 4. 按价格变化分组，获取每次价格变化的首次出现时间
result = valid_orders.groupby(['price_change_id', '平台', '商家编码', '商品单价']).agg({
    '订单提交时间': 'min',  # This gets the first occurrence time of this price
    '商品数量': 'sum',
    '到手价': 'mean',
    '订单应付金额': 'sum',
    '平台实际承担优惠金额': 'sum',
    '达人实际承担优惠金额': 'sum'
}).reset_index()

# 5. 按平台、商家和时间排序，显示价格变化轨迹
result = result.sort_values(by=['平台', '商家编码', '订单提交时间'])


# 整理列名和顺序
result.rename(columns={'订单提交时间': '该价位首次出现时间'}, inplace=True)
result = result[['平台', '商家编码', '该价位首次出现时间', '商品数量', '商品单价', '到手价', '订单应付金额', '平台实际承担优惠金额', '达人实际承担优惠金额']]

# 保存
output_file = r'H:\pycharmproject\需求\最新组合装单价_按时间变动.xlsx'
result.to_excel(output_file, index=False)

print(f"处理完成！结果已保存至: {output_file}")
print("前5行示例：")
print(result[['商家编码', '该价位首次出现时间', '商品单价']].head(5))






